
package com.zhonghong.xml;

import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.OutputFormat;
import org.dom4j.io.SAXReader;
import org.dom4j.io.XMLWriter;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;

public class XmlUtil {
    private Document mDocument; // 整个XML文档对象
    private Element rootElement; // XML文档的根节点<resource>
    private OutputFormat xmlFormat; // xml格式设置

    public XmlUtil() {
    }

    /**
     * Xml文件的初始化：创建出模板
     */
    public void initXml() {
        mDocument = DocumentHelper.createDocument();
        // 创建root--<resources>
        rootElement = mDocument.addElement("resources");

        // 设置文件编码
        xmlFormat = new OutputFormat();
        xmlFormat.setEncoding("UTF-8");
        // 设置换行
        xmlFormat.setNewlines(true);
        // 生成缩进
        xmlFormat.setIndent(true);
        // 使用4个空格进行缩进, 可以兼容文本编辑器
        xmlFormat.setIndent("    ");
    }

    /**
     * 添加一个<string>节点
     * 
     * @param nameStr ： name属性名称(从strings.xml文件中获取)
     * @param nameText： name字符串值(从excel中读取)
     * @throws IOException
     */
    public void addNode(String nameStr, String nameText) {
        // 生成root的一个接点
        Element param = rootElement.addElement("string");
        // 为节点添加属性
        param.addAttribute("name", nameStr);
        // 为节点添加文本, 也可以用addText()
        param.addText(nameText);

    }

    /**
     * 将内存中的xml文件写入磁盘
     * 
     * @param directory: 要写入的目录
     * @throws IOException
     */
    public void writeToFile(File directory, String fileName) {
        FileWriter fileWriter = null;
        try {
            String xmlPath = directory.getAbsolutePath() + File.separator + fileName;
            fileWriter = new FileWriter(xmlPath);
        } catch (IOException e1) {
            e1.printStackTrace();
        }

        // 创建写文件方法
        XMLWriter xmlWriter = new XMLWriter(fileWriter, xmlFormat);

        // 写入文件
        try {
            xmlWriter.write(mDocument);
            // 关闭
            xmlWriter.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void write2File(File directory, String fileName) throws IOException {
        FileWriter fileWriter = null;
        String xmlPath = directory.getAbsolutePath() + File.separator + fileName;
        fileWriter = new FileWriter(xmlPath);

        // 创建写文件方法
        XMLWriter xmlWriter = new XMLWriter(fileWriter, xmlFormat);

        // 写入文件
        xmlWriter.write(mDocument);
        // 关闭
        xmlWriter.close();
    }

    /**
     * 读取string.xml文件中的所有键值
     * 
     * @param xmlFile string.xml文件对象
     * @return 键值集合
     */
    public ArrayList<String> readSrcXml(File xmlFile) {
        ArrayList<String> keys = new ArrayList<String>();
        try {
            SAXReader reader = new SAXReader();
            reader.setEncoding("utf-8");
            Document document = reader.read(xmlFile);
            // 获取根节点 <resources> </resources>
            Element root = document.getRootElement();
            // 获取所有的<string name="action_str"> </string>节点
            List<Element> strList = root.elements();
            for (int i = 0; i < strList.size(); i++) {
                // 遍历集合,得到<string>节点的所有name属性值
                String text = strList.get(i).attribute(0).getText();
                keys.add(text);
            }
            return keys;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    public ArrayList<String> readSrcXmlException(File file) throws DocumentException {
        ArrayList<String> nameList = new ArrayList<String>();
        SAXReader reader = new SAXReader();
        Document document = reader.read(file);
        // 获取根节点 <resources> </resources>
        Element root = document.getRootElement();
        // 获取所有的<string name="action_str"> </string>节点
        List<Element> strList = root.elements();
        for (int i = 0; i < strList.size(); i++) {
            // 遍历集合,得到<string>节点的所有name属性值
            String text = strList.get(i).attribute(0).getText();
            nameList.add(text);
        }
        return nameList;
    }

    /**
     * 读取xml文件中的所有键值对
     * 
     * @param file
     * @return 键值对map
     */
    public Map readXml(File file) {
        Map<String, String> xmlKeyValues = new TreeMap<String, String>();
        try {
            SAXReader reader = new SAXReader();
            Document document = reader.read(file);

            // 获取根节点 <resources> </resources>
            Element root = document.getRootElement();
            // 获取所有的<string name="action_str"> </string>节点
            List<Element> strList = root.elements();

            for (int i = 0; i < strList.size(); i++) {
                // 遍历集合,得到<string>节点的所有name属性值
                String key = strList.get(i).attribute(0).getText();
                String value = strList.get(i).getStringValue();
                xmlKeyValues.put(key, value);
            }
            return xmlKeyValues;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

    /**
     * 使用ArrayList保存读取到的键值对集合，以便保证其读取顺序
     * @param file
     * @return 键值对数组
     */
    public List[] readXMlWithArray(File file) {
        List<String> keys = new ArrayList<String>();
        List<String> values = new ArrayList<String>();
        List[] lists = {keys, values};
        try {
            SAXReader reader = new SAXReader();
            Document document = reader.read(file);

            // 获取根节点 <resources> </resources>
            Element root = document.getRootElement();
            // 获取所有的<string name="action_str"> </string>节点
            List<Element> strList = root.elements();

            for (int i = 0; i < strList.size(); i++) {
                // 遍历集合,得到<string>节点的所有name属性值
                String key = strList.get(i).attribute(0).getText();
                String value = strList.get(i).getStringValue();
                keys.add(key);
                values.add(value);
            }
            return lists;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

/*    public static void main(String[] args) {
        XmlUtil x = new XmlUtil();
        List<String>[] lists = x.readXMlWithArray(new File("strings.xml"));
        List<String> keys = lists[0];
        List<String> values = lists[1];
        for (int i = 0; i < keys.size(); i++) {
            System.out.println(keys.get(i) + ":" + values.get(i));
        }
        
//        Map<String, String> treeMap = (TreeMap<String, String>) x.readXml(new File("strings.xml"));
//
//        // HashMap的循环，如果既需要key也需要value，直接用:
//        for (Entry<String, String> entry : treeMap.entrySet()) {
//            String key = entry.getKey();
//            String value = entry.getValue();
//            System.out.println(key + " : " + value);
//        }
//        // 如果只是遍历key而无需value，直接用
//        for (String key : treeMap.keySet()) {
//
//        }
    }*/

}
